﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez.Produccion.Enfermedades_y_control_de_estanques;
using BussinessLogicTecnoPez.Produccion.FaenamientoEnvasado;

/*
 * bugs:
 * si dice que el empleado ya ha sido asignado en la fecha, de todos
 * modos cambia la fecha porque modifica directamente el objeto de session
 * ver el tema de reasignar fechas, que el usuario pueda elegir
 * 
 */
public partial class Modules_FaenamientoEnvasado_Asignacion : System.Web.UI.Page
{
    private const string _VIEW_STATE_MODIFY = "VIEW_STATE_MODIFY";
    private bool isValidDate = false;

    private DetallePlanFaenamientoEnvasado DetallePlan
    {
        get { return Session["detallePlanFaenamiento"] as DetallePlanFaenamientoEnvasado; }
        set { Session["detallePlanFaenamiento"] = value; }
    }
    private bool IsUpdate
    {
        get { return Convert.ToBoolean(ViewState["IsUpdate"]); }
        set { ViewState["IsUpdate"] = value; }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            cmdEditarFin.Text = "Modificar";
            ViewState[_VIEW_STATE_MODIFY] = string.Empty;
            EnableControls(false);
            this.cmdCancelar.OnClientClick = "window.close(); return false;";
            if (this.Request.QueryString["id"] != null && this.Request.QueryString["id"] != string.Empty)
            {
                SetData(Convert.ToInt32(this.Request.QueryString["id"]));
                //si no viene el parametro modo, es modo update
                this.IsUpdate = this.Request.QueryString["mode"] == null || this.Request.QueryString["mode"] == string.Empty;
            }
            else
            {
                SetFechaInicio();
            }
        }
        else
        {
            if (ViewState[_VIEW_STATE_MODIFY].ToString() == string.Empty)
                CalcularFechaHasta();
        }
        TPPEmpleado.ObjType = typeof(Empleado);
        TPPTarea.ObjType = typeof(Tarea);
    }
    private void SetFechaInicio()
    {
        if (this.DetallePlan != null && this.DetallePlan.ItemList.Count > 0)
        {
            ItemDetallePlanFaenamientoEnvasado objItem = this.DetallePlan.ItemList[this.DetallePlan.ItemList.Count - 1] as ItemDetallePlanFaenamientoEnvasado;
            if (objItem != null)
            {
                TPCFechaDesde.Text = objItem.FechaHasta.ToShortDateString();
                txtHoraDesde.Text = objItem.FechaHasta.ToShortTimeString();
            }
        }
    }
    private void SetData(int id)
    {
        ItemDetallePlanFaenamientoEnvasado objItem = null;
        foreach (ItemDetallePlanFaenamientoEnvasado objAux in this.DetallePlan.ItemList)
        {
            if (objAux.Asignacion.IdAsignacion == id)
            {
                objItem = objAux;
                break;
            }
        }
        if (objItem != null)
        {
            TPPEmpleado.ItemSelected = objItem.Empleado;
            TPPTarea.ItemSelected = objItem.Tarea;
            TPCFechaDesde.Text = objItem.FechaDesde.ToShortDateString();
            txtHoraDesde.Text = objItem.FechaDesde.ToShortTimeString();
            lblFechaHastaData.Text = objItem.FechaHasta.ToShortDateString();
            lblHoraHastaData.Text = objItem.FechaHasta.ToShortTimeString();
            TPCFechaHasta.Text = objItem.FechaHasta.ToShortDateString();
            txtHoraHasta.Text = objItem.FechaHasta.ToShortTimeString();
            txtObservaciones.Text = objItem.Asignacion.Observaciones;

            if (Asignacion.GetFechaFin(objItem.FechaDesde, objItem.Tarea.Duracion) != objItem.FechaHasta)
            {
                cmdEditarFin.Text = "Por defecto";
                ViewState[_VIEW_STATE_MODIFY] = "Modifica";
            }
            else
            {
                cmdEditarFin.Text = "Modificar";
                ViewState[_VIEW_STATE_MODIFY] = string.Empty;
            }
        }
        else
        {
            cmdEditarFin.Text = "Modificar";
            ViewState[_VIEW_STATE_MODIFY] = string.Empty;
        }
    }
    private void CalcularFechaHasta()
    {
        if (TPCFechaDesde.Text.Trim() == string.Empty || txtHoraDesde.Text.Trim() == string.Empty)
            return;

        Tarea objTarea = TPPTarea.ItemSelected as Tarea;
        if (objTarea != null)
        {
            try
            {
                DateTime objFechaHasta;
                objFechaHasta = Asignacion.GetFechaFin(Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaDesde.Text), txtHoraDesde.Text), objTarea.Duracion);
                TPCFechaHasta.Text = objFechaHasta.ToShortDateString();
                txtHoraHasta.Text = objFechaHasta.ToShortTimeString();
                lblFechaHastaData.Text = objFechaHasta.ToShortDateString();
                lblHoraHastaData.Text = objFechaHasta.ToShortTimeString();

                isValidDate = true;
            }
            catch (Exception ex)
            {
                isValidDate = false;
                TPCFechaHasta.Text = "";
                txtHoraHasta.Text = "";
                lblFechaHastaData.Text = "";
                lblHoraHastaData.Text = "";
                _lblError.Text = ex.Message;
            }
        }
    }
    private void EnableControls(bool enabled)
    {
        TPCFechaHasta.Visible = enabled;
        txtHoraHasta.Visible = enabled;
        lblFechaHastaData.Visible = !enabled;
        lblHoraHastaData.Visible = !enabled;
        rfvFechaHasta.Enabled = enabled;
        rfvHoraHasta.Enabled = enabled;
        cmdCalcular.Visible = !enabled;
    }
    protected void cmdEditarFin_Click(object sender, EventArgs e)
    {
        if (TPCFechaHasta.Visible)
        {
            EnableControls(false);
            cmdEditarFin.Text = "Modificar";
            ViewState[_VIEW_STATE_MODIFY] = "";
        }
        else
        {
            EnableControls(true);
            cmdEditarFin.Text = "Por defecto";
            ViewState[_VIEW_STATE_MODIFY] = "Modifica";
        }
    }
    protected void cmdCalcular_Click(object sender, EventArgs e)
    {
        CalcularFechaHasta();
    }
    protected void cmdAceptar_Click(object sender, EventArgs e)
    {
        if (Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaDesde.Text), txtHoraDesde.Text) < DateTime.Now)
        {
            _lblError.Text = "La fecha de la asignación debe ser mayor a la fecha actual.";
            return;
        }
        bool blnExist = false;
        int intPosition = 0;
        if (this.DetallePlan != null && this.DetallePlan.ItemList.Count > 0)
        {
            foreach (ItemDetallePlanFaenamientoEnvasado objItem in this.DetallePlan.ItemList)
            {
                if (objItem.Asignacion.IdAsignacion == Convert.ToInt32(this.Request.QueryString["id"]))
                {
                    objItem.Asignacion.Empleado = TPPEmpleado.ItemSelected as Empleado;
                    objItem.Asignacion.Tarea = TPPTarea.ItemSelected as Tarea;
                    objItem.Asignacion.FechaDesde = Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaDesde.Text), txtHoraDesde.Text);
                    objItem.Asignacion.FechaHasta = Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaHasta.Text), txtHoraHasta.Text);
                    objItem.Asignacion.Observaciones = txtObservaciones.Text;

                    if (!VerificarFechas(objItem))
                    {
                        return;
                    }
                    blnExist = true;
                    break;
                }
                intPosition++;
            }
            if (intPosition < this.DetallePlan.ItemList.Count - 1 && !RecalcularFechas(intPosition))
                return;
        }
        if (!blnExist)
        {
            if (this.DetallePlan == null)
                this.DetallePlan = new DetallePlanFaenamientoEnvasado();
            Asignacion objAsignacion = new Asignacion();

            objAsignacion.IdAsignacion = this.GetLastAsignationID();
            objAsignacion.Empleado = TPPEmpleado.ItemSelected as Empleado;
            objAsignacion.Tarea = TPPTarea.ItemSelected as Tarea;
            objAsignacion.FechaDesde = Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaDesde.Text), txtHoraDesde.Text);
            objAsignacion.FechaHasta = Asignacion.ConcatenarFechaHora(Convert.ToDateTime(TPCFechaHasta.Text), txtHoraHasta.Text);
            objAsignacion.Observaciones = txtObservaciones.Text;

            ItemDetallePlanFaenamientoEnvasado objItem = new ItemDetallePlanFaenamientoEnvasado(objAsignacion);
            if (!VerificarFechas(objItem))
            {
                return;
            }
            this.DetallePlan.ItemList.Add(objItem);
        }
        this.ClientScript.RegisterClientScriptBlock(this.GetType(), "Asignacion", "window.opener.LoadAsignaciones(); window.close();", true);
    }
    private bool RecalcularFechas(int posicion)
    {
        //solo para el mismo empleado que el de la asignacion actual
        ItemDetallePlanFaenamientoEnvasado objItem = this.DetallePlan.ItemList[posicion] as ItemDetallePlanFaenamientoEnvasado;
        ItemDetallePlanFaenamientoEnvasado objAux = null;

        DateTime datFechaDesde = objItem.FechaHasta;
        for (int i = posicion + 1; i < this.DetallePlan.ItemList.Count; i++)
        {
            objAux = this.DetallePlan.ItemList[i] as ItemDetallePlanFaenamientoEnvasado;
            if (objAux.Empleado != null && objAux.Asignacion.Empleado.IdEmpleado == objItem.Empleado.IdEmpleado)
            {
                objAux.Asignacion.FechaDesde = datFechaDesde;
                objAux.Asignacion.SetFechaFin();
                datFechaDesde = objAux.Asignacion.FechaHasta;
            }
        }
        return true;
    }
    private int GetLastAsignationID()
    {
        int max = 0;
        foreach (ItemDetallePlanFaenamientoEnvasado objItem in this.DetallePlan.ItemList)
        {
            if (max < objItem.Asignacion.IdAsignacion)
                max = objItem.Asignacion.IdAsignacion;
        }
        return max + 1;
    }
    private bool VerificarFechas(ItemDetallePlanFaenamientoEnvasado objItem)
    {
        /*
         * esta verificacion de fechas tiene un bug
         * 
         * caso: tengo asignacion 12:30 a 12:45
         * y voy a asignar de 12:00 a 13:00
         */

        DateTime datFechaLibre = DateTime.Now;
        if (this.IsUpdate)
        {
            if (!objItem.Asignacion.VerificarFechasUpdate(out datFechaLibre))
            {
                _lblError.Text = "El empleado ya posee asignaciones en las fechas indicadas. \n El empleado se encuentra libre a partir de " + datFechaLibre.ToShortDateString() + " a las " + datFechaLibre.ToShortTimeString();
                return false;
            }
        }
        else
        {
            if (!objItem.Asignacion.VerificarFechas(out datFechaLibre))
            {
                _lblError.Text = "El empleado ya posee asignaciones en las fechas indicadas. \n El empleado se encuentra libre a partir de " + datFechaLibre.ToShortDateString() + " a las " + datFechaLibre.ToShortTimeString();
                return false;
            }
        }
        //verifico en las asignaciones en session
        foreach (ItemDetallePlanFaenamientoEnvasado objItemDetalle in this.DetallePlan.ItemList)
        {
            //si no es la asignacion en cuestion y el empleado es el mismo, verifico fechas
            if (objItemDetalle.Asignacion.IdAsignacion != objItem.Asignacion.IdAsignacion && objItemDetalle.Empleado!=null && objItemDetalle.Empleado.IdEmpleado == objItem.Asignacion.Empleado.IdEmpleado)
            {
                if (objItem.FechaDesde >= objItemDetalle.FechaDesde && objItem.FechaDesde < objItemDetalle.FechaHasta)
                {
                    datFechaLibre = getFreeDate(objItem.Asignacion);
                    _lblError.Text = "El empleado ya posee asignaciones en las fechas indicadas. \n El empleado se encuentra libre a partir de " + datFechaLibre.ToShortDateString() + " a las " + datFechaLibre.ToShortTimeString();
                    return false;
                }
                if (objItem.FechaHasta > objItemDetalle.FechaDesde && objItem.FechaHasta <= objItemDetalle.FechaHasta)
                {
                    datFechaLibre = getFreeDate(objItem.Asignacion);
                    _lblError.Text = "El empleado ya posee asignaciones en las fechas indicadas. \n El empleado se encuentra libre a partir de " + datFechaLibre.ToShortDateString() + " a las " + datFechaLibre.ToShortTimeString();
                    return false;
                }
            }
        }
        return true;
    }
    private DateTime getFreeDate(Asignacion objAsignacion)
    {
        DateTime dateFechaLibre = DateTime.Today;
        foreach (ItemDetallePlanFaenamientoEnvasado objItem in this.DetallePlan.ItemList)
        {
            if (objItem.Empleado != null && objItem.Asignacion.IdAsignacion != objAsignacion.IdAsignacion && objItem.Empleado.IdEmpleado == objAsignacion.Empleado.IdEmpleado)
            {
                dateFechaLibre = objItem.FechaHasta;
            }
        }
        return dateFechaLibre;
    }
}
